#pragma once

#include <iostream>
#include <fstream>

class util
{
public:
    static bool ReadFileContent(std::string filename, std::string *out)
    {
        // 图片是二进制读取的，而默认是以文本形式读取
        // 网络真正在读取的时候是面向字节流，而我们这里的方法是面向字符流
        //  (*out).clear();
        //  std::ifstream in(filename);
        //  if(!in.is_open())
        //  {
        //      std::cout << "read file content fail" << std::endl;
        //      return false;
        //  }
        //  std::string line;
        //  while(getline(in, line))
        //  {
        //      *out += line;
        //  }
        //  in.close();
        int filesize = FileSize(filename);
        if (filesize > 0)
        {
            std::ifstream in(filename);
            if(!in.is_open())
            {
                return false;
            }
            (*out).resize(filesize);
            in.read((char*)(out->c_str()), filesize); //通过ifstream进行二进制形式文件读取
            return true;
        }
        else
        {
            return false;
        }
    }

    static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep)
    {
        int pos = bigstr.find(sep);
        if (pos == std::string::npos)
        {
            return false;
        }
        *out += bigstr.substr(0, pos);
        bigstr.erase(0, pos + sizeof(sep));
        return true;
    }

    // 一切外界读进来的东西，都是char类型的一维数组
    static int FileSize(std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary);
        if (!in.is_open())
        {
            std::cout << "ifstream fail" << std::endl;
            return 0;
        }
        in.seekg(0, in.end);       // 将当前文件的读写位置从0设置到文件读写位置的结尾
        int filesize = in.tellg(); // 返回当前文件的读写位置
        in.seekg(0, in.beg);       // 将当前读写位置从偏移量为0的位置设置到文件开头的读写位置
        in.close();
        return filesize;
    }

private:
};